package cn.tedu.store.service.impl;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.tedu.store.entity.Cart;
import cn.tedu.store.mapper.CartMapper;
import cn.tedu.store.service.ICartService;
import cn.tedu.store.service.ex.AccessDeniedException;
import cn.tedu.store.service.ex.CartNotFoundException;
import cn.tedu.store.service.ex.InsertException;
import cn.tedu.store.service.ex.UpdateException;
import cn.tedu.store.vo.CartVO;
@Service
public class CartServiceImpl implements ICartService {
	
	@Autowired
	CartMapper cartMapper;

	/*添加到购物车*/
	@Override
	public void addToCart(Integer uid, Long gid, Integer num, String username) throws InsertException, UpdateException {
		//根据用户id和商品id，先查询购物车有没有
		Cart result = findByUidAndGid(uid,gid);
		//创建当前时间，为后面createdTime和modefiedTime做准备
		Date now = new Date();
		if(result==null) {
			//购物车没有，第一次添加到购物车
			Cart cart = new Cart();
			cart.setUid(uid);
			cart.setGid(gid);
			cart.setNum(num);
			cart.setModefiedTime(now);
			cart.setModefiedUser(username);
			cart.setCreatedTime(now);
			cart.setCreatedUser(username);
			addnew(cart);
		}else {
			//购物车有该商品了，不是第一次添加，修改商品数量
			Integer oldNum = result.getNum();
			Integer newNum = oldNum+num;
			Integer cid = result.getCid();
			String modefiedUser = username;
			Date modefiedTime = now;
			updateNum(cid, newNum, modefiedUser, modefiedTime);
		}

	}
	
	 /* 查询购物车*/
	@Override
	public List<CartVO> getByUid(Integer uid) {
		return findByUid(uid);
	}
	
	
	/**
	 * 购物车数量增加方法
	 */
	@Override
	public Integer addNum(Integer cid, Integer uid, String username)
			throws AccessDeniedException, CartNotFoundException, UpdateException {
		//根据cid查询购物车数据
		Cart result = findByCid(cid);
		if(result==null) {
			throw new CartNotFoundException("购物车数据不存在");
		}
		if(result.getUid()!=uid) {
			throw new AccessDeniedException("数据归属不正确，请操作自己的数据");
		}
		//得到购物车数据的原来num
		Integer newNUm = result.getNum()+1;
		
		//更新num
		updateNum(cid, newNUm, username, new Date());
		//返回增加后的数量
		return newNUm;
	}
	
	/**
	 * 购物车数量减少方法
	 */
	@Override
	public Integer reduceNum(Integer cid, Integer uid, String username)
			throws AccessDeniedException, CartNotFoundException, UpdateException {
		//根据cid查询购物车数据
		Cart result = findByCid(cid);
		if(result==null) {
			throw new CartNotFoundException("购物车数据不存在");
		}
		if(result.getUid()!=uid) {
			throw new AccessDeniedException("数据归属不正确，请操作自己的数据");
		}
		//得到购物车数据的原来num
		Integer newNUm = result.getNum()-1;
		
		//更新num
		updateNum(cid, newNUm, username, new Date());
		//返回增加后的数量
		return newNUm; //返回数量封装到JSON中的data，用于页面呈现
	}
	

	/**
	 * 根据勾选的所有的cid，得到查询结果的列表
	 */
	@Override
	public List<CartVO> getByCids(Integer[] cids, Integer uid) {
		
		List<CartVO> result = findByCids(cids);
		//遍历查询结果，在遍历的过程中对集合的元素数量改变，一定要用迭代器
		Iterator<CartVO> it = result.iterator();
		while(it.hasNext()) {
			if(it.next().getUid()!=uid) {
				it.remove();
			}
		}
		//返回查询结果对象
		return result;
	}
	
	
	

	/* 私有化持久层的方法*/
	//根据uid查询，购物车中的所有列表
	private List<CartVO> findByUid(Integer uid) {
		return cartMapper.findByUid(uid);
	}
	//添加到购物车
	private void addnew(Cart cart) throws InsertException {
		Integer rows = cartMapper.addnew(cart);
		if(rows!=1) {
			throw new InsertException("添加到购物车失败，出现未知异常");
		}
	};
	//更新购物车中的数量
	private void updateNum(
			Integer cid,
			Integer num,
			String modefiedUser,
			Date modefiedTime
			) throws UpdateException {
		Integer rows = cartMapper.updateNum(cid, num, modefiedUser, modefiedTime);
		if(rows!=1) {
			throw new UpdateException("修改商品数量失败，出现未知异常");
		}
	}
	//根据用户id和商品id查找
	private Cart findByUidAndGid(Integer uid,Long gid) {
		return cartMapper.findByUidAndGid(uid, gid);
	}
	
	//根据cid查询购物车数据
	private Cart findByCid(Integer cid) {
		return cartMapper.findByCid(cid);
	}

	//根据cids查询对应的列表
	private List<CartVO> findByCids(Integer[] cids){
		
		return cartMapper.findByCids(cids);
		
	}



}
